﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Framework.Entidade.Acesso;
using System.Configuration;
using System.Data;
using Framework.Util.Enumerador;
using Framework.Util;

namespace Framework.AcessoDados.Acesso
{
    public class AD_Grupo
    {
        #region Construtor

        public EN_Grupo Construtor(SqlDataReader dr)
        {
            if (dr == null) { throw new ArgumentNullException("reader"); }

            int id = dr.GetOrdinal("id");
            int nome = dr.GetOrdinal("nome");
            int descricao = dr.GetOrdinal("descricao");
            int status = dr.GetOrdinal("status");

            EN_Grupo objGrupo = new EN_Grupo();

            //Recuperando campos do retorno do objeto
            if (!dr.IsDBNull(id))
            {
                objGrupo.Id = dr.GetInt32(id);
            }
            if (!dr.IsDBNull(nome))
            {
                objGrupo.Nome = dr.GetString(nome);
            }
            if (!dr.IsDBNull(descricao))
            {
                objGrupo.Descricao = dr.GetString(descricao);
            }
            if (!dr.IsDBNull(status))
            {
                objGrupo.Status = dr.GetBoolean(status);
            }

            return objGrupo;
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Método responsável pela listagem de todos os Grupos já cadastrados conforme filtro
        /// </summary>
        /// <param name="nome">Nome do Grupo</param>
        /// <param name="status">Status do Grupo</param>
        /// <returns>Lista de Objetos EN_Grupo preenchidos</returns>
        public List<EN_Grupo> Listar(string nome, string status)
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString;

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;

            string where = string.Empty;
            int count = 0;

            if (!string.IsNullOrEmpty(nome))
            {
                where += " AND nome LIKE @nome ";
                cmd.Parameters.Add("@nome", SqlDbType.VarChar, 50);
                cmd.Parameters[count].Value = string.Concat("%", nome, "%");
                count++;
            }
            if (!string.IsNullOrEmpty(status))
            {
                if (status != StatusEnum.T.ToString())
                {
                    status = status == StatusEnum.A.ToString() ? "True" : "False";

                    where += " AND (status = @status) ";
                    cmd.Parameters.Add("@status", SqlDbType.Bit);
                    cmd.Parameters[count].Value = status;
                }
            }

            cmd.CommandText = string.Format(@"SELECT id, nome, descricao, status FROM ACE_Grupo WHERE (1 = 1) {0} ", where);

            EN_Grupo objGrupo = new EN_Grupo();
            List<EN_Grupo> lstGrupos = new List<EN_Grupo>();

            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    objGrupo = this.Construtor(dr);
                    lstGrupos.Add(objGrupo);
                }

                conn.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstGrupos;
        }

        /// <summary>
        /// Método responsável pelo retorno do Grupo desejado
        /// </summary>
        /// <param name="id">id do Grupo</param>
        /// <returns>Objeto EN_Grupo preenchido</returns>
        public EN_Grupo RetornarGrupo(int id)
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString;

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = @"SELECT id, nome, descricao, status FROM ACE_Grupo WHERE id = @id";
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters[0].Value = id;

            EN_Grupo objGrupo = new EN_Grupo();

            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                if (dr.Read())
                {
                    objGrupo = this.Construtor(dr);
                }

                conn.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return objGrupo;
        }

        /// <summary>
        /// Método responsável por Salvar o Grupo no Banco de Dados
        /// Insere ou Altera
        /// </summary>
        /// <param name="objGrupo">Objeto Grupo preenchido</param>
        /// <param name="conn">Objeto SqlConnection</param>
        /// <param name="trans">Objeto SqlTransaction</param>
        /// <returns>Id do Grupo</returns>
        public int Salvar(EN_Grupo objGrupo, SqlConnection conn, SqlTransaction trans)
        {
            int idGrupo = 0;

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Add("@nome", SqlDbType.VarChar, 50);
            cmd.Parameters[0].Value = objGrupo.Nome;

            cmd.Parameters.Add("@descricao", SqlDbType.VarChar, 500);
            cmd.Parameters[1].Value = objGrupo.Descricao;

            cmd.Parameters.Add("@status", SqlDbType.Bit);
            cmd.Parameters[2].Value = objGrupo.Status;

            if (objGrupo.Id == 0)
            {
                cmd.CommandText = @"INSERT INTO ACE_Grupo
                                                (nome, descricao, status)
                                            VALUES
                                                (@nome, @descricao, @status)
        
                                    SELECT @@identity";
            }
            else
            {
                cmd.CommandText = @"UPDATE ACE_Grupo
                                        SET nome = @nome
                                            ,descricao = @descricao
                                            ,status = @status
                                        WHERE id = @id
        
                                    SELECT @id";

                cmd.Parameters.Add("@id", SqlDbType.Int);
                cmd.Parameters[3].Value = objGrupo.Id;
            }

            try
            {
                cmd.Transaction = trans;
                idGrupo = Convert.ToInt32(cmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return idGrupo;
        }

        /// <summary>
        /// Método responsável por Excluir/Inativar o Grupo desejado
        /// </summary>
        /// <param name="id">id do Grupo</param>
        /// <param name="conn">Objeto SqlConnection</param>
        /// <param name="trans">Objeto SqlTransaction</param>
        public void Excluir(int id, SqlConnection conn, SqlTransaction trans)
        {
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;

            cmd.CommandText = @"UPDATE ACE_Grupo
                                SET status = 'False'
                                WHERE id = @id";

            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters[0].Value = id;

            try
            {
                cmd.Transaction = trans;
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }
}
